﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using CapaDeDatos.EF;
using CapaDeDominio;
using CapaDeDatos;

namespace CapaDePrueba
{
    [TestFixture]
    public class TestSalaDAO
    {
        // Atributos a utilizar durante las pruebas
        private ISalaDAO SalaDAO = null;
        private ILocalDAO localDAO = null;
        private IServicioDAO servicioDAO = null;
        private int codigoGenerado = 0;

        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            // 1. Definimos la implementación del DAO a probar (ADO / NH / EF)
            SalaDAO = new CapaDeDatos.EF.SalaDAO();
            localDAO = new CapaDeDatos.EF.LocalDAO();
            // 3. Creamos 2 locales para tenerlos disponibles en las pruebas
            SalaDAO.Crear(new Sala() { Nombre = "Rock 80s", Caracteristicas = "Premium", Capacidad = 8, Local = localDAO.Obtener(1), Comentarios = "Zzz..." });
            SalaDAO.Crear(new Sala() { Nombre = "Electrónico 90s", Caracteristicas = "VIP", Capacidad = 6, Local = localDAO.Obtener(2) });
        }
        [Test]
        public void Test1_Crear()
        {
            // 1. Clase a probar: SalaDAO
            Assert.IsNotNull(SalaDAO);
            // 2. Declaramos e instanciamos la entidad de dominio
            Sala SalaACrear = new Sala();
            SalaACrear.Nombre = "Elvis Lives";
            SalaACrear.Caracteristicas = "Magic";
            SalaACrear.Capacidad = 4;
            SalaACrear.Local = new Local() { Codigo = 1 };
            SalaACrear.Comentarios = "Sin comentarios";
            // 3. Declaramos la entidad que contendrá el resultado
            Sala SalaCreada = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                SalaCreada = SalaDAO.Crear(SalaACrear);
                codigoGenerado = SalaCreada.Codigo;
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(SalaCreada);
            // Probamos que el código generado sea mayor a 0
            Assert.Greater(SalaCreada.Codigo, 0);
            // Probamos que el nombre registrado es igual al solicitado con la entidad
            Assert.AreEqual(SalaCreada.Nombre, SalaACrear.Nombre);
            // Probamos que la característica registrada es igual a la solicitada con la entidad
            Assert.AreEqual(SalaCreada.Caracteristicas, SalaACrear.Caracteristicas);
        }
        [Test]
        public void Test2_Obtener()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(SalaDAO);
            // 2. Definimos los datos para la prueba
            int codigo = codigoGenerado;
            // 3. Declaramos la entidad que contendrá el resultado
            Sala salaObtenida = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                salaObtenida = SalaDAO.Obtener(codigo);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(salaObtenida);
            Assert.AreEqual(salaObtenida.Codigo, codigo);
            Assert.IsNotNullOrEmpty(salaObtenida.Nombre);
            Assert.IsNotNullOrEmpty(salaObtenida.Caracteristicas);
        }

        [Test]
        public void Test3_ListarXFiltros()
        {
            Assert.IsNotNull(SalaDAO);
            ICollection<Sala> SalasEncontradas = null;
            Local local = localDAO.Obtener(1);
            Servicio servicio = servicioDAO.Obtener(1);

            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                SalasEncontradas = SalaDAO.ListarXFiltros("Sala 1", local, 1, true, 2, servicio);
            });

            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(SalasEncontradas);
            // Probamos que la cantidad de salas encontrados sea 2
            Assert.AreEqual(SalasEncontradas, 0, "No se encontraron salas con las coincidencias");
        }

        [Test]
        public void Test5_ListarTodos()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(SalaDAO);
            // 2. Declaramos la entidad que contendrá el resultado
            ICollection<Sala> SalasEncontradas = null;
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                SalasEncontradas = SalaDAO.ListarTodos();
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(SalasEncontradas);
            // Probamos que la cantidad de salas encontrados sea 2
            Assert.AreEqual(SalasEncontradas.Count, 2);
            // Probamos que cada sala contenga la cadena de búsqueda en su nombre
            foreach (Sala SalaEncontrada in SalasEncontradas)
            {
                Assert.IsNotNull(SalaEncontrada);
                Assert.IsInstanceOf(typeof(Sala), SalaEncontrada);
            }
        }
        [Test]
        public void Test6_ListarXBusqueda()
        {
            // 1. Clase a probar: SalaDAO
            Assert.IsNotNull(SalaDAO);
            // 2. Definimos los datos para la prueba
            string nombre = "ock"; // Rock *
            // 3. Declaramos la entidad que contendrá el resultado
            //ICollection<Sala> SalasEncontradas = null;
            int SalasEncontradas = -1;
            Local local= new Local();
            local.Direccion="";
            local.Nombre="";
            localDAO.Crear(local);

            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                SalasEncontradas = SalaDAO.ListarXCoincidencia(nombre, local);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(SalasEncontradas);
            // Probamos que la cantidad de salas encontrados sea 2
            Assert.AreEqual(SalasEncontradas, 1);
            // Probamos que cada sala contenga la cadena de búsqueda en su nombre
            /*foreach (Sala SalaEncontrada in SalasEncontradas)
            {
                Assert.IsTrue(SalaEncontrada.Nombre.Contains(nombre));
            }*/
        }
    }
}
